跳至主要内容

Docker Network

容器網路怎麼搞​

YoMin Su


基礎環節​


怎麼會有這個主題?​


當今天在使用 Docker 運行你的系統時,我們通常都是透過 docker-compose 這個工具,協助我們自動建立容器間的網路,僅將需要對外的 Port 開出,但我們卻沒有想過其運作的細節,因此今天才會出現這個主題。


這個可以應用在哪裡?​


若你對於容器之間的網路有特殊的要求,或是想要將不需要在同一個網路的幾個微服務,透過同一個 Compose 檔案一起管理時,網路就是相當重要的工具,能讓你達成這個目標。


有需要另外安裝什麼嗎?​


今天討論的內容,都將基於在 Linux 系統下執行的 Docker Engine,所以當安裝好 Docker 後,就應該是開箱即用的,不需要另外在安裝其他工具。


我系統上的網路跟想像的不太一樣​


剛剛也有提到,會是以 Linux 系統作為底層的網路介紹,因此,若是 Windows/macOS 這兩者的話,則無法保證實作細節與 Linux 完全相同


網路驅動​

Network drivers​


首先要來看看 Docker 官方提供了哪些使用網路的方式,在官方文件的說明中,目前 Engine 提供了6種不同的網路驅動,可以配合自身的需求去應用,讓我們一一說明!


1. bridge (橋接模式)​

這個是最普遍的模式,也是系統在安裝好時,就會預先設定好並能馬上使用的一種模式,其工作概念是,在系統中新增一個網橋(docker0),並在啟動容器後,將指定要Mapping到外部的Port,Binding在這個介面上,透過這個方式,就能讓你從系統訪問到你的容器啦~


2. host (主機模式)​

這種模式可以理解為,直接把容器的應用程式實際掛在主機(Host)上運行,若容器中需要使用 80 Port,那在將此容器運作起來時,就會直接佔用主機上的 80 Port,省去了Mapping的部分,對於網路效能來說會更好。


3. overlay (覆蓋模式)​

這種模式的應用主要是當有多台主機(Host),其各自都有安裝 Docker,且希望底下的容器可以跨主機通訊時,就會使用到這種模式。通常會跟 Docker Swarm 一起出現。


4|5. IPvlan, MACvlan​

這兩者都是虛擬介面的應用,IPvlan是共用同一組MAC位置,有多個IP,而MACvlan則是虛擬出多組MAC位置,這與應用時的需要有比較直接的關係,若希望容器取得從分享器分配的IP時,也會採用這種模式,但不是今天的主要目標。


6. none​

什麼都沒有,對,什麼預設都沒有,通常這種類型是用來搭配自定義的網路服務,因此提供了這種選項,不過,此選項與 Docker Swarm 衝突,若想同時使用,需要另外處理。


補充資料​


Bridge Networks​

橋接網路​


分成兩種​

預設網橋自定義網橋
DefaultUser-defined

先看看預設網橋​

  • ip addr
  • docker network ls



說說預設的特點​


  1. 不需另外設定,開箱即用
  2. 透過『docker run』執行的容器預設的網路

來看看自定義網橋​




自定義的好處?​


  1. 自定義網橋提供容器間自動DNS解析
  2. 提供更好的隔離性
  3. 可以在容器運行時動態的加入或離開網路
  4. 每個自定義網橋的設定都相互不影響

怎麼管理自定義網橋?​


# 列出目前網路
docker network ls

# 新增網路
docker network create <name>

# 刪除現有網路
docker network rm <name>

該怎麼把容器加入進去?​


# 建立容器並加入網路
docker run --name my-nginx --network my-net --publish 8080:80 nginx

# 從現有網橋拔除
docker network disconnect my-net my-nginx

# 加入到另外一個網橋
docker network connect none my-nginx

有沒有更簡單的方法?​


有,使用 docker-compose,這會直接建立一個以資料夾為名稱的網路,簡單省事。


Host Networking​

主機網路​


最最最單純的那種​

直接把容器需要的『連接埠』綁定到Host上


好處 or 優點?​

  1. 不透過內部網路進行轉換,消耗資源少
  2. 直接綁定Host端的連接埠,不用另外設定映射
  3. 少了轉換的消耗,網路效能更好

壞處 or 缺點?​

  1. 容器需要的Port不能被佔用 (因為無法透過映射修改)
  2. 開出去的容器允許所有來源 (Listen的IP Source為0.0.0.0)

如何知道容器需要哪些『埠』?​

在不做任何預設定的情況下先執行一次



Overlay Networking​

覆蓋網路​


Docker Swarm​

類似 Kubernetes 的服務,方便建立幾台主機的叢集,一起管理

  1. Networking with overlay networks
  2. 使用 Docker Swarm 管理多台 Server 的服務

Live Demo 時間​

  1. 來實際建立一個跨主機的 Overlay Network
  2. 並在兩台主機上分別加入一個容器,測試兩容器是否可以互相Ping到對方。

Bridge with Docker-Compose​

Compose 來了!​


如何在Compose中建立Bridge?​


networks:
net1:
driver: bridge
net2:
driver: host

docker-compose.yml


如何將容器指定到網路?​


services:
app1:
image: aaa
networks:
- net1
app2:
image: bbb
networks:
- net2

來看看實際的效果​


範例的Compose​

version: "3"

services:
host1:
image: alpine
command: tail -F anything
networks:
- cluster1
host2:
image: alpine
command: tail -F anything
networks:
- cluster2
host3:
image: alpine
command: tail -F anything
networks:
- cluster1
host4:
image: alpine
command: tail -F anything
networks:
- cluster2

networks:
cluster1:
driver: bridge
cluster2:
driver: bridge

補充資料​

Networking in Compose